package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup
var rwMutex sync.RWMutex

// RWMutex  读写锁
func main() {

	//rwMutex.Lock() //第一种可以直接使用var定义对象

	// var rwMutex *sync.RWMutex 第二种可以直接使用var的指针定义对象
	// rwMutex = new(sync.RWMutex)
	// rwMutex.Lock()
	wg.Add(3)
	// go read("读类型1")
	// go read("读类型2")
	// go read("读类型3")
	go write("方法1")
	go write("方法2")
	go write("方法3")
	fmt.Println("进入上锁阶段")
	wg.Wait()
	time.Sleep(1 * time.Second)
	fmt.Println("程序执行完毕")
}
func read(str string) {
	defer wg.Done()
	fmt.Println("开始读操作")
	rwMutex.RLock() //上锁
	fmt.Println(str, "正在进行读操作")
	rwMutex.RUnlock() //解锁
	fmt.Println("读取完毕")
}

func write(str string) {
	defer wg.Done()
	fmt.Println("开始写操作")
	rwMutex.Lock()
	fmt.Println("正在进行写操作", str)
	fmt.Println("写入完毕")
	rwMutex.Unlock()
}

//ps: 写操作和读操作互斥, 加了些操作,读取会等待, 读取可以同时添加多个,而写操作只能同一时间存在一个.
